package Modelo;


import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Random;

public class Partido {
	private String codigo;
	private Equipo equipoCasa, equipoVisitante;
	private Calendar fechaPartido;
	private Umpire principal;
	private int inning, carrerasCasa, carrerasVisitante;
	private HashMap<Jugador,Integer> jugadoresCasaCi, jugadoresVisitanteCi;
	private HashMap<Jugador,Integer> jugadoresCasaHr, jugadoresVisitanteHr;
	private Random aleatorio;
	private boolean seguir = true;
	private boolean extrainning = false;
	int s = 1;
	
	public Partido(String codigo, Equipo equipoCasa,
			Equipo equipoVisitante, Calendar fechaPartido, Umpire principal) {
		super();
		this.codigo = codigo;
		
		this.equipoCasa = equipoCasa;
		this.equipoVisitante = equipoVisitante;
		this.fechaPartido = fechaPartido;
		this.principal = principal;
		
		 this.jugadoresCasaCi = new HashMap<Jugador,Integer>();
		 this.jugadoresVisitanteCi= new HashMap<Jugador,Integer>();
		 this.jugadoresCasaHr = new HashMap<Jugador,Integer>();
		 this.jugadoresVisitanteHr= new HashMap<Jugador,Integer>();
	}

	
	
	public Partido() {
		super();
		this.codigo = "";
		this.carrerasCasa = 0;
		this.carrerasVisitante = 0;
		this.equipoCasa = null;
		this.equipoVisitante = null;
		this.fechaPartido = null;
		this.principal = null;
		this.inning = 0;
		this.jugadoresCasaCi = new HashMap<Jugador,Integer>();
		 this.jugadoresVisitanteCi= new HashMap<Jugador,Integer>();
		 this.jugadoresCasaHr = new HashMap<Jugador,Integer>();
		 this.jugadoresVisitanteHr= new HashMap<Jugador,Integer>();
	}



	public String getCodigo() {
		return codigo;
	}
	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}
	public int getCarrerasCasa() {
		return carrerasCasa;
	}
	public void setCarrerasCasa(int carrerasCasa) {
		this.carrerasCasa = carrerasCasa;
	}
	public int getCarrerasVisitante() {
		return carrerasVisitante;
	}
	public void setCarrerasVisitante(int carrerasVisitante) {
		this.carrerasVisitante = carrerasVisitante;
	}
	public Equipo getEquipoCasa() {
		return equipoCasa;
	}
	public void setEquipoCasa(Equipo equipoCasa) {
		this.equipoCasa = equipoCasa;
	}
	public Equipo getEquipoVisitante() {
		return equipoVisitante;
	}
	public void setEquipoVisitante(Equipo equipoVisitante) {
		this.equipoVisitante = equipoVisitante;
	}
	public Calendar getFechaPartido() {
		return fechaPartido;
	}
	public void setFechaPartido(Calendar fechaPartido) {
		this.fechaPartido = fechaPartido;
	}
	public Umpire getPrincipal() {
		return principal;
	}
	public void setPrincipal(Umpire principal) {
		this.principal = principal;
	}
	public int getInning() {
		return inning;
	}
	public void setInning(int inning) {
		this.inning = inning;
	}
	public HashMap<Jugador, Integer> getJugadoresCasaCi() {
		return jugadoresCasaCi;
	}
	public void setJugadoresCasaCi(HashMap<Jugador, Integer> jugadoresCasaCi) {
		this.jugadoresCasaCi = jugadoresCasaCi;
	}
	public HashMap<Jugador, Integer> getJugadoresVisitanteCi() {
		return jugadoresVisitanteCi;
	}
	public void setJugadoresVisitanteCi(
			HashMap<Jugador, Integer> jugadoresVisitanteCi) {
		this.jugadoresVisitanteCi = jugadoresVisitanteCi;
	}
	public HashMap<Jugador, Integer> getJugadoresCasaHr() {
		return jugadoresCasaHr;
	}
	public void setJugadoresCasaHr(HashMap<Jugador, Integer> jugadoresCasaHr) {
		this.jugadoresCasaHr = jugadoresCasaHr;
	}
	public HashMap<Jugador, Integer> getJugadoresVisitanteHr() {
		return jugadoresVisitanteHr;
	}
	public void setJugadoresVisitanteHr(
			HashMap<Jugador, Integer> jugadoresVisitanteHr) {
		this.jugadoresVisitanteHr = jugadoresVisitanteHr;
	}
	
public void Simular(){
	 
     
     int numero ;
	 
	carrerasCasa = 0;
	carrerasVisitante=0;
	inning=0;
	aleatorio = new Random();
	
	while (seguir){
	
	
	{ // bloque equipo visitante
		 numero = aleatorio.nextInt(3) ;
		
		if (((carrerasVisitante + numero) <= 15) ){
			carrerasVisitante +=numero;
		}
		else if (((carrerasVisitante + numero) > 15) && (inning<=9)){
			//int diferencia = 15 - carrerasVisitante;
			carrerasVisitante =15;
						
		}
		else if (((carrerasVisitante + numero) > 15) && (inning>=9)){
			carrerasVisitante +=numero;
		}
		
		
	}// fin bloque equipo visitante
	
	
	
	{// bloque equipo casa
			
			int numero2 = aleatorio.nextInt(3);
				
			if (((carrerasCasa + numero2) <= 15)){
				carrerasCasa +=numero2;
			}
			else if (((carrerasCasa + numero2) > 15) && (inning<=9)){
					carrerasCasa =15;
			}
			else if (((carrerasCasa + numero2) > 15) && (inning>=9)){
					carrerasCasa +=numero2;
			}
				
				
	}// fin bloque equipo casa
	
	
	if ((carrerasCasa == carrerasVisitante) && (inning >= 9)){
		inning++;
		
		extrainning = true;
	}
	
	else if ((Math.abs(carrerasCasa - carrerasVisitante)>0) && (inning >= 9) ){
		seguir = false;
		
	}
			
	if (inning < 9){
	inning++;
	}
	
	}
	// incrementamos los juegos jugados de los equipos
	equipoCasa.setJuegosJugados(equipoCasa.getJuegosJugados()+1);
	equipoVisitante.setJuegosJugados(equipoVisitante.getJuegosJugados()+1);
	
	// asignamos quien gano y quien perdio
	if (carrerasCasa > carrerasVisitante){
		equipoCasa.setJuegosGanados(equipoCasa.getJuegosGanados()+1);
		equipoVisitante.setJuegosPerdidos(equipoVisitante.getJuegosPerdidos()+1);
	} else {
		equipoVisitante.setJuegosGanados(equipoVisitante.getJuegosGanados()+1);
		equipoCasa.setJuegosPerdidos(equipoCasa.getJuegosPerdidos()+1);
	}
	
	// para asignar los jonrones verificamos que ambos equipos tengan mas de  2 carreras
	if (carrerasCasa >= 2 && carrerasVisitante >=2 ){
			
		asignarJonrones();
		
	}
	asignarCi();	
	
		
}// fin del metodo

public void imprimirEstadisticas(){
	
	System.out.println("\t\t\t\t\t  RESULTADO  \t\t\t\t\t");
	System.out.println(equipoVisitante.getNombreEquipo()+ "  " + carrerasVisitante + "  -  " + carrerasCasa
			+ "  " + equipoCasa.getNombreEquipo() );
	System.out.println("Inning : "+ inning);
	
	
	
	Iterator itjcci = jugadoresCasaCi.entrySet().iterator();
	Iterator itjvci = jugadoresVisitanteCi.entrySet().iterator();
	Iterator itjchr = jugadoresCasaHr.entrySet().iterator();
	Iterator itjvhr = jugadoresVisitanteHr.entrySet().iterator();
	
	
	{ // bloque de recorrido Iterator
		// los iterator tienen la siguiente nomenclatura
		// it: que significa iterador
		// jv: jugador visitante    jc: jugador de casa
		// hr: jonrones             ci: carreras impulsadas
	
	
	System.out.println("\t\t\t\t\tIMPULSORES DEL EQUIPO VISITANTE\t\t\t\t\t");
			
	while (itjvci.hasNext()) {
	Map.Entry e = (Map.Entry)itjvci.next();
	System.out.println( ((Jugador)e.getKey()).getNombre() + " " +((Jugador)e.getKey()).getApellido() 
			+ " " + e.getValue() + " CI");
	} // fin del while recorrer jugadores que impulsan carreras equipo de visita
	System.out.println("\n");
	
	if (jugadoresVisitanteHr.size() > 0){
		System.out.println("\t\t\t\t\tJONRONEROS DEL EQUIPO VISITANTE\t\t\t\t\t");
		while (itjvhr.hasNext()) {
			Map.Entry e = (Map.Entry)itjvhr.next();
			System.out.println( ((Jugador)e.getKey()).getNombre() + " " +((Jugador)e.getKey()).getApellido() 
					+ " " + e.getValue() + " HR");
			} // fin del while recorrer jugadores que Conectan jonrones equipo de visita
		System.out.println("\n\n");
	}
	
	
	System.out.println("\t\t\t\t\tIMPULSORES DEL EQUIPO CASA\t\t\t\t\t");
	while (itjcci.hasNext()) {
		Map.Entry e = (Map.Entry)itjcci.next();
		System.out.println( ((Jugador)e.getKey()).getNombre() + " " +((Jugador)e.getKey()).getApellido() 
				+ " " + e.getValue() + " CI");
		} // fin del while recorrer jugadores que impulsan carreras equipo de casa
	
	if (jugadoresCasaHr.size() > 0){
		System.out.println("\t\t\t\t\tJONRONEROS DEL EQUIPO CASA\t\t\t\t\t");
		while (itjchr.hasNext()) {
		Map.Entry e = (Map.Entry)itjchr.next();
		System.out.println( ((Jugador)e.getKey()).getNombre() + " " +((Jugador)e.getKey()).getApellido() 
				+ " " + e.getValue() + " HR");
		} // fin del while recorrer jugadores que Conectan jonrones equipo de casa	
	}
	
	
	
	} // Fin del bloque de recorrido Iterator
	
	
}// fin del metodo

private void asignarJonrones(){
	aleatorio.setSeed(new Date().getTime()+s);
	
	int hr=0;
	int valor = aleatorio.nextInt(6);
	//System.out.println("El case fue : " +valor);
	int indice;
	
	switch (valor) {
	
	case 0:
		break;
		
	case 1:// en el juego hubo solo un jonron fue de la visita
		
			indice = aleatorio.nextInt(equipoVisitante.getJugadores().size());
			jugadoresVisitanteHr.put(equipoVisitante.getJugadores().get(indice), 1);
	break;
		
			
	case 2:// en el juego hubo solo un jonron fue de la visita
		
		indice = aleatorio.nextInt(equipoCasa.getJugadores().size());
		jugadoresCasaHr.put(equipoCasa.getJugadores().get(indice), 1);
	
		break;
		
		
	case 3:// en el juego hubo 2 jonrones uno de cada uno 
		
		indice = aleatorio.nextInt(equipoVisitante.getJugadores().size());
		jugadoresVisitanteHr.put(equipoVisitante.getJugadores().get(indice), 1);
	
		indice = aleatorio.nextInt(equipoCasa.getJugadores().size());
		jugadoresCasaHr.put(equipoCasa.getJugadores().get(indice), 1);
		
		break;
		
	case 4:// en el juego hubo 2 jonrones ambos de la visita 
	
		for (int i =0;i<2;i++){
			indice = aleatorio.nextInt(equipoVisitante.getJugadores().size());
						
				
			if(jugadoresVisitanteHr.get(equipoVisitante.getJugadores().get(indice))!=null){
				hr=2;		
				
				jugadoresVisitanteHr.put(equipoVisitante.getJugadores().get(indice), hr);
					
			} else {
				hr=1;
				jugadoresVisitanteHr.put(equipoVisitante.getJugadores().get(indice), hr);
			}
			equipoVisitante.getJugadores().get(indice).setHr(hr);
			
		}// fin del for
			break;	
			
		
	case 5: //en el juego hubo 2 jonrones ambos de casa
		
		for (int i =0;i<2;i++){
			indice = aleatorio.nextInt(equipoCasa.getJugadores().size());
						
				
			if(jugadoresCasaHr.get(equipoCasa.getJugadores().get(indice))!=null){
				hr=2;		
				
				jugadoresCasaHr.put(equipoCasa.getJugadores().get(indice), hr);
					
			} else {
				hr=1;
				jugadoresCasaHr.put(equipoCasa.getJugadores().get(indice), hr);
			}
			equipoCasa.getJugadores().get(indice).setHr(hr);
			
		}// fin del for
		
		break;
		
		default: System.out.println("El case fue : " +valor);
		
	}
	
}// fin del metodo asignar jonrones


private void asignarCi(){
	
	
	int ci=0;
	
	int equipo1 =carrerasVisitante;
	int equipo2 =carrerasCasa;
	
	
			Iterator itjvhr = jugadoresVisitanteHr.entrySet().iterator();
			
			while (itjvhr.hasNext()) {
			Map.Entry e = (Map.Entry)itjvhr.next();
			
			if(jugadoresVisitanteCi.get((Jugador)e.getKey())!=null){
				
			ci = jugadoresVisitanteCi.get((Jugador)e.getKey())+ (Integer)e.getValue();
			jugadoresVisitanteCi.put((Jugador)e.getKey(), ci);
			equipo1-=	(Integer)e.getValue();
			}
			else {
					jugadoresVisitanteCi.put((Jugador)e.getKey(), (Integer)e.getValue());
					equipo1-=	(Integer)e.getValue();	
				} // fin del if else
			
			for (int i =0;i<equipoVisitante.getJugadores().size();i++){
				
				if (((Jugador)e.getKey()).getCedula().equalsIgnoreCase(equipoVisitante.getJugadores().get(i).getCedula())){
					equipoVisitante.getJugadores().get(i).setCi(equipoVisitante.getJugadores().get(i).getCi()+(Integer)e.getValue());
				}	
			} // fin del for
			
		}// fin del while asignar jonrones a peloteros visitantes
			
			for (int i =0;i<equipo1;i++){	
				
				int indice = aleatorio.nextInt(equipoVisitante.getJugadores().size());
				
				if(jugadoresVisitanteCi.get(equipoVisitante.getJugadores().get(indice))!=null){
					ci = jugadoresVisitanteCi.get(equipoVisitante.getJugadores().get(indice))+1;
					jugadoresVisitanteCi.put(equipoVisitante.getJugadores().get(indice), ci);
					
				}
				else {
					jugadoresVisitanteCi.put(equipoVisitante.getJugadores().get(indice), 1);
					
				} // fin del if else
				equipoVisitante.getJugadores().get(indice).setCi(equipoVisitante.getJugadores().get(indice).getCi()+1);
				
			} // fin del for
			
				
Iterator itjchr = jugadoresCasaHr.entrySet().iterator();
			
			while (itjchr.hasNext()) {
			Map.Entry e = (Map.Entry)itjchr.next();
			
			if(jugadoresCasaCi.get((Jugador)e.getKey())!=null){
				
			ci = jugadoresCasaCi.get((Jugador)e.getKey())+ (Integer)e.getValue();
			jugadoresCasaCi.put((Jugador)e.getKey(), ci);
			equipo2-=	(Integer)e.getValue();
			}
			else {
				jugadoresCasaCi.put((Jugador)e.getKey(), (Integer)e.getValue());
					equipo2-=	(Integer)e.getValue();	
				} // fin del if else
			
			for (int i =0;i<equipoCasa.getJugadores().size();i++){
				
				if (((Jugador)e.getKey()).getCedula().equalsIgnoreCase(equipoCasa.getJugadores().get(i).getCedula())){
					equipoCasa.getJugadores().get(i).setCi(equipoCasa.getJugadores().get(i).getCi()+(Integer)e.getValue());
				}	
			} // fin del for
			
		}// fin del while asignar jonrones a peloteros visitantes
			
			for (int i =0;i<equipo2;i++){	
				
				int indice = aleatorio.nextInt(equipoCasa.getJugadores().size());
				
				if(jugadoresCasaCi.get(equipoCasa.getJugadores().get(indice))!=null){
					ci = jugadoresCasaCi.get(equipoCasa.getJugadores().get(indice))+1;
					jugadoresCasaCi.put(equipoCasa.getJugadores().get(indice), ci);
					
				}
				else {
					jugadoresCasaCi.put(equipoCasa.getJugadores().get(indice), 1);
					
				} // fin del if else
				equipoCasa.getJugadores().get(indice).setCi(equipoCasa.getJugadores().get(indice).getCi()+1);
				
			} // fin del for
			
			
}// fin del metodo asignarCi
}// fin de la clase
